perm filename CLRIMP.FAI[SS,SYS]2 blob sn#709900 filedate 1983-05-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	 A ACWPRV PDLEN S%FIN2 S%TIMW DEVNAM DEVSER STATE GTIMER IMPDDB SYSTOP SYSREL DDBSAV CONFRM NUMBAD NUMCLR PDL CLRIMP LOOP CLRONE NXTIMP ALLDON OCTOUT OCTOU1 DECOUT DECOU1 YESNO CPOPJ1 CPOPJ YESNO1 YESNO2
C00009 ENDMK
C⊗;
;⊗ A ACWPRV PDLEN S%FIN2 S%TIMW DEVNAM DEVSER STATE GTIMER IMPDDB SYSTOP SYSREL DDBSAV CONFRM NUMBAD NUMCLR PDL CLRIMP LOOP CLRONE NXTIMP ALLDON OCTOUT OCTOU1 DECOUT DECOU1 YESNO CPOPJ1 CPOPJ YESNO1 YESNO2

	TITLE CLRIMP

;Program to clear away hanging IMP DDBs "cleanly" by changing the state
;to Time Wait and setting a timer.  This ensures that the DDBFls routine
;will be called and release all free storage pointed to by this DDB.

A←←1 ↔ B←←2 ↔ DDB←←3 ↔ P←←17

ACWPRV←←40		;LH priv bit
PDLEN←←20
S%FIN2←←=7		;State we want to get out of
S%TIMW←←=9		;State we want to get into

;IMP DDB words, with AC field set for indirect access
DEVNAM:	0(DDB)
DEVSER:	3(DDB)
STATE:	(DDB)			;To be filled in with .SYMLed value
GTIMER:	(DDB)			;To be filled in with .SYMLed value

;Other storage
IMPDDB:	0			;Address of model IMP DDB
SYSTOP:	0			;Start of system free storage
SYSREL:	0			;Relocation for system core
DDBSAV:	0			;Address of current DDB
CONFRM:	0			;Whether to confirm each DDB
NUMBAD:	0			;Number of bad DDBs found
NUMCLR:	0			;Number cleared
PDL:	BLOCK PDLEN

CLRIMP:	RESET
	SETZM NUMBAD
	SETZM NUMCLR
	MOVE P,[IOWD PDLEN,PDL]
	MOVSI A,1
	GETPRV A,		;Get passive privs
	TLNN A,ACWPRV		;Can this guy write core?
	 JRST [ OUTSTR [ASCIZ/Sorry, only wizards can run this program./]
		EXIT]
	MOVSI A,ACWPRV
	SETPRV A,		;Enable
	MOVEI A,[RADIX50 0,IMPDDB ↔ 0]
	.SYML A,
	 JRST [ OUTSTR [ASCIZ/.SYML failed for IMPDDB./]
		EXIT]
	MOVEM A,IMPDDB
	MOVEI A,[RADIX50 0,STATE ↔ RADIX50 0,WAITS]
	.SYML A,
	 JRST [ OUTSTR [ASCIZ/.SYML failed for STATE./]
		EXIT]
	HRRM A,STATE
	MOVEI A,[RADIX50 0,GTIMER ↔ RADIX50 0,WAITS]
	.SYML A,
	 JRST [ OUTSTR [ASCIZ/.SYML failed for GTIMER./]
		EXIT]
	HRRM A,GTIMER
	MOVEI A,265
	PEEK A,			;Get SYSTOP
	PEEK A,
	TRZ A,1777		;Make sure it's a 1K boundary
	CAILE A,400000		;Not beyond 400000, though
	 MOVEI A,400000
	MOVEM A,SYSTOP
	MOVEI B,400000		;Compute relocation for later offsets
	SUB B,A
	MOVEM B,SYSREL
	MOVE B,A
	ADDI B,377776		;Get as much as possible, writeable
	HRL A,B
	SETPR2 A,		;Map system into upper segment
	 JRST [ OUTSTR [ASCIZ/SETPR2 lost./]
		EXIT]
	SETOM CONFRM		;Assume yes
	OUTSTR [ASCIZ/Do you want to confirm each DDB being cleared? /]
	PUSHJ P,YESNO
	SETZM CONFRM		;No

	MOVE A,IMPDDB
	ADD A,DEVSER
	HRRZ A,A
	PEEK A,
	HLRZ DDB,A		;Address of first IMP DDB
LOOP:	MOVEM DDB,DDBSAV	;Save before relocating
	ADD DDB,SYSREL		;Relocate to upper segment
	HLRZ A,@DEVNAM		;Get device name
	CAIE A,'IMP'		;Is it an IMP?
	 JRST ALLDON		;No
	SKIPL A,@STATE		;Get connection's TCP state, skip if error
	CAIN A,S%FIN2		;In the losing state?
	CAIA			;Skip if candidate for clearing
	JRST NXTIMP		;No
	AOS NUMBAD		;Count them
	SKIPN CONFRM		;Does he want to confirm?
	 JRST CLRONE		;No
	OUTSTR [ASCIZ/IMP DDB at /]
	MOVE A,DDBSAV
	PUSHJ P,OCTOUT		;Clobbers A and B
	MOVEI A,[ASCIZ/ in error state.  Clear it? /]
	SKIPL @STATE
	MOVEI A,[ASCIZ/ in state Fin2.  Clear it? /]
	OUTSTR (A)
	PUSHJ P,YESNO
	 JRST NXTIMP		;No
CLRONE:	AOS NUMCLR		;Count number cleared
	MOVEI A,1		;Set timer
	MOVEM A,@GTIMER
	MOVEI A,S%TIMW		;Set new state
	MOVEM A,@STATE
NXTIMP:	HLRZ DDB,@DEVSER	;Get next DDB
	CAML DDB,SYSTOP		;Make sure it's in free storage
	 JRST LOOP
ALLDON:	MOVE A,NUMBAD
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ/ bad DDBs found, /]
	MOVE A,NUMCLR
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ/ cleared./]
	EXIT

OCTOUT:	IDIVI A,10
	PUSH P,B
	JUMPE A,OCTOU1
	PUSHJ P,OCTOUT
OCTOU1:	POP P,A
	ADDI A,"0"
	OUTCHR A
	POPJ P,

DECOUT:	IDIVI A,=10
	PUSH P,B
	JUMPE A,DECOU1
	PUSHJ P,DECOUT
DECOU1:	POP P,A
	ADDI A,"0"
	OUTCHR A
	POPJ P,

;Get Yes-or-no response; skip if Yes.
YESNO:	INCHRW A
	CAIN A,15		;<cr>?
	 JRST [ INCHRW A	;Yes, eat <lf>
		JRST YESNO2]
	CAIE A,"Y"
	CAIN A,"y"
	CAIA
	JRST YESNO1
	OUTSTR [ASCIZ/es.
/]
CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,

YESNO1:	CAIE A,"N"
	CAIN A,"n"
	CAIA
	JRST YESNO2
	OUTSTR [ASCIZ/o.
/]
	POPJ P,

YESNO2:	OUTSTR [ASCIZ/
Please type Y or N: /]
	JRST YESNO

	END CLRIMP